﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Configuration;

using System.Data.SqlClient;
using MySql.Data.MySqlClient;

using JA.Negocios.Cadastros;
using System.Data;

namespace JA.Negocios
{
    public static partial class ModelBO
    {

        public static ImovelVO getImovel(int idImovel, string imovel)
        {
            ImovelVO imovelVO = null;
            List<ImovelVO> listImovelVOs = getImoveis(idImovel, imovel, null, null, null, null, null, null, null, null, null, null, null, null);
            if (listImovelVOs != null && listImovelVOs.Count > 0)
            {
                imovelVO = listImovelVOs[0];
            }
            return imovelVO;
        }

        public static List<ImovelVO> getImoveis()
        {
            return getImoveis(null, null, null, null, null, null, null, null, null, null, null, null);
        }

        public static List<ImovelVO> getImoveis(int? idImovel, string imovel, int? idTipo, int? idCategoria, string siglaUF, int? idCidade, int? idBairro, int? idBairroAdic, int? quartos, int? idCliente, bool? ativo, bool? publicado)
        {
            string where = "WHERE ";
            StringBuilder query = new StringBuilder();

            query.AppendLine("SELECT IdImovel, Titulo, Descricao, VlrTotVda, Permuta, AreaUtil, AreaTotal, VlrCond, ");
            query.AppendLine("       Quartos, Suites, VagasGaragem, Andares, UnidAndar, imovel.Ativo, Publicar, ");
            query.AppendLine("       imovel.Cadastro, imovel.CadastradoPor, imovel.Edicao, imovel.EditadoPor, ");
            query.AppendLine("       obs, imovel.IdTipo, tipo.Tipo, imovel.idCategoria, categoria.Categoria, ");
            query.AppendLine("       uf.Sigla, uf.Estado, cidade.IdCidade, cidade.Cidade, imovel.IdBairro, bairro.Bairro, ");
            query.AppendLine("       imovel.idCliente, cliente.Nome ");
            query.AppendLine("FROM imovel ");
            query.AppendLine("     LEFT JOIN tipo ON imovel.IdTipo = tipo.IdTipo ");
            query.AppendLine("     LEFT JOIN categoria ON imovel.idCategoria = categoria.idCategoria ");
            query.AppendLine("     LEFT JOIN cliente ON imovel.idCliente = cliente.idCliente ");
            query.AppendLine("     LEFT JOIN bairro ");
            query.AppendLine("               LEFT JOIN cidade ");
            query.AppendLine("                         LEFT JOIN uf ON cidade.sigla = uf.sigla  ");
            query.AppendLine("                    ON bairro.idCidade = cidade.IdCidade ");
            query.AppendLine("          ON imovel.idBairro = bairro.idBairro ");

            if (idImovel != null)
            {
                query.AppendLine(where + "IdImovel=?IdImovel ");
                where = "AND ";
            }
            if (imovel != null)
            {
                query.AppendLine(where + "Titulo LIKE ?Titulo ");
                where = "AND ";
            }
            if (idTipo != null)
            {
                query.AppendLine(where + "imovel.IdTipo=?IdTipo ");
                where = "AND ";
            }
            if (idCategoria != null)
            {
                query.AppendLine(where + "imovel.idCategoria=?IdCategoria ");
                where = "AND ";
            }
            if (siglaUF != null)
            {
                query.AppendLine(where + "uf.Sigla=?SiglaUF ");
                where = "AND ";
            }
            if (idCidade != null)
            {
                query.AppendLine(where + "cidade.IdCidade=?IdCidade ");
                where = "AND ";
            }

            if (idBairro != null && idBairroAdic != null)
            {
                query.AppendLine(where + "(bairro.IdBairro=?IdBairro OR bairro.IdBairro=?IdBairroAdic) ");
                where = "AND ";
            }
            else if (idBairro != null)
            {
                query.AppendLine(where + "bairro.IdBairro=?IdBairro ");
                where = "AND ";
            }
            else if (idBairroAdic != null)
            {
                query.AppendLine(where + "bairro.IdBairro=?IdBairroAdic ");
                where = "AND ";
            }

            if (quartos != null)
            {
                query.AppendLine(where + "Quartos" + (quartos.Value >= 4 ? ">=" : "=") + "?Quartos ");
                where = "AND ";
            }
            if (idCliente != null)
            {
                query.AppendLine(where + "cliente.IdCliente=?IdCliente ");
                where = "AND ";
            }
            if (ativo != null)
            {
                query.AppendLine(where + "imovel.Ativo=?Ativo ");
                where = "AND ";
            }
            if (publicado != null)
            {
                query.AppendLine(where + "Publicar=?Publicar ");
                where = "AND ";
            }

            query.AppendLine("ORDER BY VlrTotVda ");

            MySqlCommand cmd = getConnection();
            cmd.CommandText = query.ToString();

            if (idImovel != null) cmd.Parameters.AddWithValue("?IdImovel", idImovel);
            if (imovel != null) cmd.Parameters.AddWithValue("?Titulo", "%" + imovel + "%");
            if (idTipo != null) cmd.Parameters.AddWithValue("?IdTipo", idTipo);
            if (idCategoria != null) cmd.Parameters.AddWithValue("?IdCategoria", idCategoria);
            if (siglaUF != null) cmd.Parameters.AddWithValue("?SiglaUF", siglaUF);
            if (idCidade != null) cmd.Parameters.AddWithValue("?IdCidade", idCidade);
            if (idBairro != null) cmd.Parameters.AddWithValue("?IdBairro", idBairro);
            if (idBairroAdic != null) cmd.Parameters.AddWithValue("?IdBairroAdic", idBairroAdic);
            if (quartos != null) cmd.Parameters.AddWithValue("?Quartos", quartos);
            if (idCliente != null) cmd.Parameters.AddWithValue("?IdCliente", idCliente);
            if (ativo != null && ativo.Value) cmd.Parameters.AddWithValue("?Ativo", (ativo.Value ? 'S' : 'N'));
            if (publicado != null && publicado.Value) cmd.Parameters.AddWithValue("?Publicar", (publicado.Value ? 'S' : 'N'));

            MySqlDataReader reader = null;
            try
            {
                cmd.Connection.Open();

                reader = cmd.ExecuteReader();

                List<ImovelVO> listImovel = new List<ImovelVO>();

                while (reader.Read())
                {
                    ImovelVO imovelVO = ImovelVO.CreateImovelVO();
                    imovelVO.idImovel = reader.GetInt32(reader.GetOrdinal("IdImovel"));
                    imovelVO.titulo = reader.GetString(reader.GetOrdinal("Titulo"));
                    imovelVO.cadastro = reader.GetDateTime(reader.GetOrdinal("Cadastro"));
                    imovelVO.cadastradoPor = reader.GetString(reader.GetOrdinal("CadastradoPor"));
                    imovelVO.edicao = reader.GetDateTime(reader.GetOrdinal("Edicao"));
                    imovelVO.editadoPor = reader.GetString(reader.GetOrdinal("EditadoPor"));
                    imovelVO.descricao = reader.GetString(reader.GetOrdinal("Descricao"));
                    imovelVO.vlrTotVda = reader.GetDecimal(reader.GetOrdinal("VlrTotVda"));
                    imovelVO.permuta = reader.GetString(reader.GetOrdinal("Permuta")).Equals("S");
                    imovelVO.areaUtil = reader.GetDecimal(reader.GetOrdinal("AreaUtil"));
                    imovelVO.areaTotal = reader.GetDecimal(reader.GetOrdinal("AreaTotal"));
                    imovelVO.vlrCond = reader.GetDecimal(reader.GetOrdinal("VlrCond"));
                    imovelVO.quartos = reader.GetInt32(reader.GetOrdinal("Quartos"));
                    imovelVO.suites = reader.GetInt32(reader.GetOrdinal("Suites"));
                    imovelVO.vagasGaragem = reader.GetInt32(reader.GetOrdinal("VagasGaragem"));
                    imovelVO.andares = reader.GetInt32(reader.GetOrdinal("Andares"));
                    imovelVO.unidAndar = reader.GetInt32(reader.GetOrdinal("UnidAndar"));
                    imovelVO.ativo = reader.GetString(reader.GetOrdinal("Ativo")).Equals("S");
                    imovelVO.publicar = reader.GetString(reader.GetOrdinal("Publicar")).Equals("S");
                    imovelVO.obs = reader.GetString(reader.GetOrdinal("obs"));
                    imovelVO.tipoVO.idTipo = reader.GetInt32(reader.GetOrdinal("IdTipo"));
                    if (!reader.IsDBNull(reader.GetOrdinal("Tipo")))
                        imovelVO.tipoVO.tipo = reader.GetString(reader.GetOrdinal("Tipo"));
                    imovelVO.categoriaVO.idCategoria = reader.GetInt32(reader.GetOrdinal("idCategoria"));
                    if (!reader.IsDBNull(reader.GetOrdinal("Categoria")))
                        imovelVO.categoriaVO.categoria = reader.GetString(reader.GetOrdinal("Categoria"));
                    if (!reader.IsDBNull(reader.GetOrdinal("Sigla")))
                    {
                        imovelVO.bairroVO.cidade.uf.siglaUf = reader.GetString(reader.GetOrdinal("Sigla"));
                        imovelVO.bairroVO.cidade.uf.uf = reader.GetString(reader.GetOrdinal("Estado"));
                    }
                    else
                        imovelVO.bairroVO.cidade.uf.siglaUf = "-1";
                    if (!reader.IsDBNull(reader.GetOrdinal("IdCidade")))
                    {
                        imovelVO.bairroVO.cidade.idCidade = reader.GetInt32(reader.GetOrdinal("IdCidade"));
                        imovelVO.bairroVO.cidade.cidade = reader.GetString(reader.GetOrdinal("Cidade"));
                    }
                    else
                        imovelVO.bairroVO.cidade.idCidade = -1;
                    imovelVO.bairroVO.idBairro = reader.GetInt32(reader.GetOrdinal("IdBairro"));
                    if (!reader.IsDBNull(reader.GetOrdinal("Bairro")))
                        imovelVO.bairroVO.bairro = reader.GetString(reader.GetOrdinal("Bairro"));
                    imovelVO.clienteVO.idCliente = reader.GetInt32(reader.GetOrdinal("idCliente"));
                    if (!reader.IsDBNull(reader.GetOrdinal("Nome")))
                        imovelVO.clienteVO.nome = reader.GetString(reader.GetOrdinal("Nome"));

                    listImovel.Add(imovelVO);
                }
                reader.Close();
                return listImovel;
            }
            catch (Exception ex) { throw ex; }
            finally { cmd.Connection.Close(); }
        }

        public static List<ImovelVO> getImoveis(int? idImovel, string imovel, int? idTipo, int? idCategoria, string siglaUF, int? idCidade, int? idBairro, int? idBairroAdic, int? quartos, int? idCliente, bool? ativo, bool? publicado, string endereco, string cep)
        {
            string where = "WHERE ";
            StringBuilder query = new StringBuilder();

            query.AppendLine("SELECT IdImovel, Titulo, Descricao, VlrTotVda, Permuta, AreaUtil, AreaTotal, VlrCond, ");
            query.AppendLine("       Quartos, Suites, VagasGaragem, Andares, UnidAndar, imovel.Ativo, Publicar, ");
            query.AppendLine("       imovel.endereco, imovel.enderecoNumero, imovel.complemento, imovel.CEP, ");
            query.AppendLine("       imovel.Cadastro, imovel.CadastradoPor, imovel.Edicao, imovel.EditadoPor, ");
            query.AppendLine("       obs, imovel.IdTipo, tipo.Tipo, imovel.idCategoria, categoria.Categoria, ");
            query.AppendLine("       uf.Sigla, uf.Estado, cidade.IdCidade, cidade.Cidade, imovel.IdBairro, bairro.Bairro, ");
            query.AppendLine("       imovel.idCliente, cliente.Nome ");
            query.AppendLine("FROM imovel ");
            query.AppendLine("     LEFT JOIN tipo ON imovel.IdTipo = tipo.IdTipo ");
            query.AppendLine("     LEFT JOIN categoria ON imovel.idCategoria = categoria.idCategoria ");
            query.AppendLine("     LEFT JOIN cliente ON imovel.idCliente = cliente.idCliente ");
            query.AppendLine("     LEFT JOIN bairro ");
            query.AppendLine("               LEFT JOIN cidade ");
            query.AppendLine("                         LEFT JOIN uf ON cidade.sigla = uf.sigla  ");
            query.AppendLine("                    ON bairro.idCidade = cidade.IdCidade ");
            query.AppendLine("          ON imovel.idBairro = bairro.idBairro ");

            if (idImovel != null)
            {
                query.AppendLine(where + "IdImovel=?IdImovel ");
                where = "AND ";
            }
            if (imovel != null)
            {
                query.AppendLine(where + "Titulo LIKE ?Titulo ");
                where = "AND ";
            }
            if (idTipo != null)
            {
                query.AppendLine(where + "imovel.IdTipo=?IdTipo ");
                where = "AND ";
            }
            if (idCategoria != null)
            {
                query.AppendLine(where + "imovel.idCategoria=?IdCategoria ");
                where = "AND ";
            }
            if (siglaUF != null)
            {
                query.AppendLine(where + "uf.Sigla=?SiglaUF ");
                where = "AND ";
            }
            if (idCidade != null)
            {
                query.AppendLine(where + "cidade.IdCidade=?IdCidade ");
                where = "AND ";
            }

            if (endereco != null)
            {
                query.AppendLine(where + "imovel.endereco LIKE ?endereco ");
                where = "AND ";
            }
            if (cep != null)
            {
                query.AppendLine(where + "imovel.cep=?cep ");
                where = "AND ";
            }
            if (idBairro != null && idBairroAdic != null)
            {
                query.AppendLine(where + "(bairro.IdBairro=?IdBairro OR bairro.IdBairro=?IdBairroAdic) ");
                where = "AND ";
            }
            else if (idBairro != null)
            {
                query.AppendLine(where + "bairro.IdBairro=?IdBairro ");
                where = "AND ";
            }
            else if (idBairroAdic != null)
            {
                query.AppendLine(where + "bairro.IdBairro=?IdBairroAdic ");
                where = "AND ";
            }

            if (quartos != null)
            {
                query.AppendLine(where + "Quartos" + (quartos.Value >= 4 ? ">=" : "=") + "?Quartos ");
                where = "AND ";
            }
            if (idCliente != null)
            {
                query.AppendLine(where + "cliente.IdCliente=?IdCliente ");
                where = "AND ";
            }
            if (ativo != null)
            {
                query.AppendLine(where + "imovel.Ativo=?Ativo ");
                where = "AND ";
            }
            if (publicado != null)
            {
                query.AppendLine(where + "Publicar=?Publicar ");
                where = "AND ";
            }

            query.AppendLine("ORDER BY VlrTotVda ");

            MySqlCommand cmd = getConnection();
            cmd.CommandText = query.ToString();

            if (idImovel != null) cmd.Parameters.AddWithValue("?IdImovel", idImovel);
            if (imovel != null) cmd.Parameters.AddWithValue("?Titulo", "%" + imovel + "%");
            if (idTipo != null) cmd.Parameters.AddWithValue("?IdTipo", idTipo);
            if (idCategoria != null) cmd.Parameters.AddWithValue("?IdCategoria", idCategoria);
            if (siglaUF != null) cmd.Parameters.AddWithValue("?SiglaUF", siglaUF);
            if (idCidade != null) cmd.Parameters.AddWithValue("?IdCidade", idCidade);
            if (endereco != null) cmd.Parameters.AddWithValue("?endereco", "%" + endereco + "%");
            if (cep != null) cmd.Parameters.AddWithValue("?cep", cep);
            if (idBairro != null) cmd.Parameters.AddWithValue("?IdBairro", idBairro);
            if (idBairroAdic != null) cmd.Parameters.AddWithValue("?IdBairroAdic", idBairroAdic);
            if (quartos != null) cmd.Parameters.AddWithValue("?Quartos", quartos);
            if (idCliente != null) cmd.Parameters.AddWithValue("?IdCliente", idCliente);
            if (ativo != null && ativo.Value) cmd.Parameters.AddWithValue("?Ativo", (ativo.Value ? 'S' : 'N'));
            if (publicado != null && publicado.Value) cmd.Parameters.AddWithValue("?Publicar", (publicado.Value ? 'S' : 'N'));

            MySqlDataReader reader = null;
            try
            {
                cmd.Connection.Open();

                reader = cmd.ExecuteReader();

                List<ImovelVO> listImovel = new List<ImovelVO>();

                while (reader.Read())
                {
                    ImovelVO imovelVO = ImovelVO.CreateImovelVO();
                    imovelVO.idImovel = reader.GetInt32(reader.GetOrdinal("IdImovel"));
                    imovelVO.titulo = reader.GetString(reader.GetOrdinal("Titulo"));
                    imovelVO.cadastro = reader.GetDateTime(reader.GetOrdinal("Cadastro"));
                    imovelVO.cadastradoPor = reader.GetString(reader.GetOrdinal("CadastradoPor"));
                    imovelVO.edicao = reader.GetDateTime(reader.GetOrdinal("Edicao"));
                    imovelVO.editadoPor = reader.GetString(reader.GetOrdinal("EditadoPor"));
                    imovelVO.descricao = reader.GetString(reader.GetOrdinal("Descricao"));
                    imovelVO.endereco = reader.GetStringNullCheck(reader.GetOrdinal("endereco"));
                    imovelVO.enderecoNumero = reader.GetStringNullCheck(reader.GetOrdinal("enderecoNumero"));
                    imovelVO.complemento = reader.GetStringNullCheck(reader.GetOrdinal("complemento"));
                    imovelVO.CEP = reader.GetStringNullCheck(reader.GetOrdinal("cep"));
                    imovelVO.vlrTotVda = reader.GetDecimal(reader.GetOrdinal("VlrTotVda"));
                    imovelVO.permuta = reader.GetString(reader.GetOrdinal("Permuta")).Equals("S");
                    imovelVO.areaUtil = reader.GetDecimal(reader.GetOrdinal("AreaUtil"));
                    imovelVO.areaTotal = reader.GetDecimal(reader.GetOrdinal("AreaTotal"));
                    imovelVO.vlrCond = reader.GetDecimal(reader.GetOrdinal("VlrCond"));
                    imovelVO.quartos = reader.GetInt32(reader.GetOrdinal("Quartos"));
                    imovelVO.suites = reader.GetInt32(reader.GetOrdinal("Suites"));
                    imovelVO.vagasGaragem = reader.GetInt32(reader.GetOrdinal("VagasGaragem"));
                    imovelVO.andares = reader.GetInt32(reader.GetOrdinal("Andares"));
                    imovelVO.unidAndar = reader.GetInt32(reader.GetOrdinal("UnidAndar"));
                    imovelVO.ativo = reader.GetString(reader.GetOrdinal("Ativo")).Equals("S");
                    imovelVO.publicar = reader.GetString(reader.GetOrdinal("Publicar")).Equals("S");
                    imovelVO.obs = reader.GetString(reader.GetOrdinal("obs"));
                    imovelVO.tipoVO.idTipo = reader.GetInt32(reader.GetOrdinal("IdTipo"));
                    if (!reader.IsDBNull(reader.GetOrdinal("Tipo")))
                        imovelVO.tipoVO.tipo = reader.GetString(reader.GetOrdinal("Tipo"));
                    imovelVO.categoriaVO.idCategoria = reader.GetInt32(reader.GetOrdinal("idCategoria"));
                    if (!reader.IsDBNull(reader.GetOrdinal("Categoria")))
                        imovelVO.categoriaVO.categoria = reader.GetString(reader.GetOrdinal("Categoria"));
                    if (!reader.IsDBNull(reader.GetOrdinal("Sigla")))
                    {
                        imovelVO.bairroVO.cidade.uf.siglaUf = reader.GetString(reader.GetOrdinal("Sigla"));
                        imovelVO.bairroVO.cidade.uf.uf = reader.GetString(reader.GetOrdinal("Estado"));
                    }
                    else
                        imovelVO.bairroVO.cidade.uf.siglaUf = "-1";
                    if (!reader.IsDBNull(reader.GetOrdinal("IdCidade")))
                    {
                        imovelVO.bairroVO.cidade.idCidade = reader.GetInt32(reader.GetOrdinal("IdCidade"));
                        imovelVO.bairroVO.cidade.cidade = reader.GetString(reader.GetOrdinal("Cidade"));
                    }
                    else
                        imovelVO.bairroVO.cidade.idCidade = -1;
                    imovelVO.bairroVO.idBairro = reader.GetInt32(reader.GetOrdinal("IdBairro"));
                    if (!reader.IsDBNull(reader.GetOrdinal("Bairro")))
                        imovelVO.bairroVO.bairro = reader.GetString(reader.GetOrdinal("Bairro"));
                    imovelVO.clienteVO.idCliente = reader.GetInt32(reader.GetOrdinal("idCliente"));
                    if (!reader.IsDBNull(reader.GetOrdinal("Nome")))
                        imovelVO.clienteVO.nome = reader.GetString(reader.GetOrdinal("Nome"));

                    listImovel.Add(imovelVO);
                }
                reader.Close();
                return listImovel;
            }
            catch (Exception ex) { throw ex; }
            finally { cmd.Connection.Close(); }
        }

        public static void setImovel(ImovelVO imovelVO)
        {
            StringBuilder query = new StringBuilder();

            query.AppendLine("UPDATE imovel ");
            query.AppendLine("SET Titulo=?Titulo, Descricao=?Descricao, VlrTotVda=?VlrTotVda, Permuta=?Permuta, ");
            query.AppendLine("    Endereco=?Endereco, EnderecoNumero=?EnderecoNumero, Complemento=?Complemento, CEP=?CEP, ");
            query.AppendLine("    AreaUtil=?AreaUtil, AreaTotal=?AreaTotal, VlrCond=?VlrCond, Quartos=?Quartos, ");
            query.AppendLine("    Suites=?Suites, VagasGaragem=?VagasGaragem, Andares=?Andares, UnidAndar=?UnidAndar, ");
            query.AppendLine("    Ativo=?Ativo, Publicar=?Publicar, Cadastro=?Cadastro, CadastradoPor=?CadastradoPor, ");
            query.AppendLine("    Edicao=?Edicao, EditadoPor=?EditadoPor, obs=?obs, idTipo=?idTipo, idCategoria=?idCategoria, ");
            query.AppendLine("    idBairro=?idBairro, idCliente=?idCliente ");
            query.AppendLine("WHERE IdImovel=?IdImovel ");

            MySqlCommand cmd = getConnection();
            cmd.CommandText = query.ToString();

            cmd.Parameters.AddWithValue("?IdImovel", imovelVO.idImovel);
            cmd.Parameters.AddWithValue("?Titulo", imovelVO.titulo);
            cmd.Parameters.AddWithValue("?Descricao", imovelVO.descricao);
            cmd.Parameters.AddWithValue("?VlrTotVda", imovelVO.vlrTotVda);
            cmd.Parameters.AddWithValue("?Permuta", (imovelVO.permuta ? 'S' : 'N'));
            cmd.Parameters.AddWithValue("?Endereco", imovelVO.endereco);
            cmd.Parameters.AddWithValue("?EnderecoNumero", imovelVO.enderecoNumero);
            cmd.Parameters.AddWithValue("?Complemento", imovelVO.complemento);
            cmd.Parameters.AddWithValue("?CEP", imovelVO.CEP);
            cmd.Parameters.AddWithValue("?AreaUtil", imovelVO.areaUtil);
            cmd.Parameters.AddWithValue("?AreaTotal", imovelVO.areaTotal);
            cmd.Parameters.AddWithValue("?VlrCond", imovelVO.vlrCond);
            cmd.Parameters.AddWithValue("?Quartos", imovelVO.quartos);
            cmd.Parameters.AddWithValue("?Suites", imovelVO.suites);
            cmd.Parameters.AddWithValue("?VagasGaragem", imovelVO.vagasGaragem);
            cmd.Parameters.AddWithValue("?Andares", imovelVO.andares);
            cmd.Parameters.AddWithValue("?UnidAndar", imovelVO.unidAndar);
            cmd.Parameters.AddWithValue("?Ativo", (imovelVO.ativo ? 'S' : 'N'));
            cmd.Parameters.AddWithValue("?Publicar", (imovelVO.publicar ? 'S' : 'N'));
            cmd.Parameters.AddWithValue("?Cadastro", imovelVO.cadastro);
            cmd.Parameters.AddWithValue("?CadastradoPor", imovelVO.cadastradoPor);
            cmd.Parameters.AddWithValue("?Edicao", imovelVO.edicao);
            cmd.Parameters.AddWithValue("?EditadoPor", imovelVO.editadoPor);
            cmd.Parameters.AddWithValue("?obs", imovelVO.obs);
            cmd.Parameters.AddWithValue("?idTipo", imovelVO.tipoVO.idTipo);
            cmd.Parameters.AddWithValue("?idCategoria", imovelVO.categoriaVO.idCategoria);
            cmd.Parameters.AddWithValue("?idBairro", imovelVO.bairroVO.idBairro);
            cmd.Parameters.AddWithValue("?idCliente", imovelVO.clienteVO.idCliente);

            try
            {
                cmd.Connection.Open();

                cmd.ExecuteNonQuery();
            }
            catch (Exception ex) { throw ex; }
            finally { cmd.Connection.Close(); }

        }

        public static long newImovel(ImovelVO imovelVO)
        {
            StringBuilder query = new StringBuilder();

            query.AppendLine("INSERT INTO imovel ");
            query.AppendLine("       ( Titulo, Descricao, Endereco, EnderecoNumero, Complemento, CEP, VlrTotVda, Permuta, AreaUtil, AreaTotal, VlrCond, Quartos, Suites, VagasGaragem, Andares, UnidAndar, Ativo, Publicar, Cadastro, CadastradoPor, Edicao, EditadoPor, obs, idTipo, idCategoria, idBairro, idCliente ) ");
            query.AppendLine("VALUES (?Titulo,?Descricao,?Endereco,?EnderecoNumero,?Complemento,?CEP,?VlrTotVda,?Permuta,?AreaUtil,?AreaTotal,?VlrCond,?Quartos,?Suites,?VagasGaragem,?Andares,?UnidAndar,?Ativo,?Publicar,?Cadastro,?CadastradoPor,?Edicao,?EditadoPor,?obs,?idTipo,?idCategoria,?idBairro,?idCliente ) ");

            MySqlCommand cmd = getConnection();
            cmd.CommandText = query.ToString();

            cmd.Parameters.AddWithValue("?Titulo", imovelVO.titulo);
            cmd.Parameters.AddWithValue("?Descricao", imovelVO.descricao);
            cmd.Parameters.AddWithValue("?Endereco", imovelVO.endereco);
            cmd.Parameters.AddWithValue("?EnderecoNumero", imovelVO.enderecoNumero);
            cmd.Parameters.AddWithValue("?Complemento", imovelVO.complemento);
            cmd.Parameters.AddWithValue("?CEP", imovelVO.CEP);
            cmd.Parameters.AddWithValue("?VlrTotVda", imovelVO.vlrTotVda);
            cmd.Parameters.AddWithValue("?Permuta", (imovelVO.permuta ? 'S' : 'N'));
            cmd.Parameters.AddWithValue("?AreaUtil", imovelVO.areaUtil);
            cmd.Parameters.AddWithValue("?AreaTotal", imovelVO.areaTotal);
            cmd.Parameters.AddWithValue("?VlrCond", imovelVO.vlrCond);
            cmd.Parameters.AddWithValue("?Quartos", imovelVO.quartos);
            cmd.Parameters.AddWithValue("?Suites", imovelVO.suites);
            cmd.Parameters.AddWithValue("?VagasGaragem", imovelVO.vagasGaragem);
            cmd.Parameters.AddWithValue("?Andares", imovelVO.andares);
            cmd.Parameters.AddWithValue("?UnidAndar", imovelVO.unidAndar);
            cmd.Parameters.AddWithValue("?Ativo", (imovelVO.ativo ? 'S' : 'N'));
            cmd.Parameters.AddWithValue("?Publicar", (imovelVO.publicar ? 'S' : 'N'));
            cmd.Parameters.AddWithValue("?Cadastro", imovelVO.cadastro);
            cmd.Parameters.AddWithValue("?CadastradoPor", imovelVO.cadastradoPor);
            cmd.Parameters.AddWithValue("?Edicao", imovelVO.edicao);
            cmd.Parameters.AddWithValue("?EditadoPor", imovelVO.editadoPor);
            cmd.Parameters.AddWithValue("?obs", imovelVO.obs);
            cmd.Parameters.AddWithValue("?idTipo", imovelVO.tipoVO.idTipo);
            cmd.Parameters.AddWithValue("?idCategoria", imovelVO.categoriaVO.idCategoria);
            cmd.Parameters.AddWithValue("?idBairro", imovelVO.bairroVO.idBairro);
            cmd.Parameters.AddWithValue("?idCliente", imovelVO.clienteVO.idCliente);

            try
            {
                cmd.Connection.Open();
                cmd.ExecuteNonQuery();
                return cmd.LastInsertedId;
            }
            catch (Exception ex) { throw ex; }
            finally { cmd.Connection.Close(); }

        }

        public static void delImovel(ImovelVO imovelVO)
        {
            StringBuilder query = new StringBuilder();

            query.AppendLine("DELETE FROM imovel ");
            query.AppendLine("WHERE IdImovel=?IdImovel ");

            MySqlCommand cmd = getConnection();
            cmd.CommandText = query.ToString();

            cmd.Parameters.AddWithValue("?IdImovel", imovelVO.idImovel);

            try
            {
                cmd.Connection.Open();

                cmd.ExecuteNonQuery();
            }
            catch (Exception ex) { throw ex; }
            finally { cmd.Connection.Close(); }

        }

        public static int getImovelXTipoCount(int? idTipo)
        {
            string where = "WHERE ";
            StringBuilder query = new StringBuilder();

            query.AppendLine("SELECT count(IdTipo) qtd ");
            query.AppendLine("FROM imovel ");

            if (idTipo != null)
            {
                query.AppendLine(where + "idTipo=?idTipo ");
                where = "AND ";
            }

            MySqlCommand cmd = getConnection();
            cmd.CommandText = query.ToString();

            if (idTipo != null) cmd.Parameters.AddWithValue("?idTipo", idTipo);

            MySqlDataReader reader = null;
            try
            {
                cmd.Connection.Open();

                reader = cmd.ExecuteReader();

                int quantidade = 0;

                if (reader.Read())
                {
                    quantidade = reader.GetInt32(reader.GetOrdinal("qtd"));
                }
                reader.Close();

                return quantidade;
            }
            catch (Exception ex) { throw ex; }
            finally { cmd.Connection.Close(); }
        }

        public static int getImovelXCategoriaCount(int? IdCategoria)
        {
            string where = "WHERE ";
            StringBuilder query = new StringBuilder();

            query.AppendLine("SELECT count(IdCategoria) qtd ");
            query.AppendLine("FROM imovel ");

            if (IdCategoria != null)
            {
                query.AppendLine(where + "IdCategoria=?IdCategoria ");
                where = "AND ";
            }

            MySqlCommand cmd = getConnection();
            cmd.CommandText = query.ToString();

            if (IdCategoria != null) cmd.Parameters.AddWithValue("?IdCategoria", IdCategoria);

            MySqlDataReader reader = null;
            try
            {
                cmd.Connection.Open();

                reader = cmd.ExecuteReader();

                int quantidade = 0;

                if (reader.Read())
                {
                    quantidade = reader.GetInt32(reader.GetOrdinal("qtd"));
                }
                reader.Close();

                return quantidade;
            }
            catch (Exception ex) { throw ex; }
            finally { cmd.Connection.Close(); }
        }

        public static int getImovelXClienteCount(int? IdCliente)
        {
            string where = "WHERE ";
            StringBuilder query = new StringBuilder();

            query.AppendLine("SELECT count(IdCliente) qtd ");
            query.AppendLine("FROM imovel ");

            if (IdCliente != null)
            {
                query.AppendLine(where + "IdCliente=?IdCliente ");
                where = "AND ";
            }

            MySqlCommand cmd = getConnection();
            cmd.CommandText = query.ToString();

            if (IdCliente != null) cmd.Parameters.AddWithValue("?IdCliente", IdCliente);

            MySqlDataReader reader = null;
            try
            {
                cmd.Connection.Open();

                reader = cmd.ExecuteReader();

                int quantidade = 0;

                if (reader.Read())
                {
                    quantidade = reader.GetInt32(reader.GetOrdinal("qtd"));
                }
                reader.Close();

                return quantidade;
            }
            catch (Exception ex) { throw ex; }
            finally { cmd.Connection.Close(); }
        }

        public static int getImovelXBairroCount(int? IdBairro)
        {
            string where = "WHERE ";
            StringBuilder query = new StringBuilder();

            query.AppendLine("SELECT count(IdBairro) qtd ");
            query.AppendLine("FROM imovel ");

            if (IdBairro != null)
            {
                query.AppendLine(where + "IdBairro=?IdBairro ");
                where = "AND ";
            }

            MySqlCommand cmd = getConnection();
            cmd.CommandText = query.ToString();

            if (IdBairro != null) cmd.Parameters.AddWithValue("?IdBairro", IdBairro);

            MySqlDataReader reader = null;
            try
            {
                cmd.Connection.Open();

                reader = cmd.ExecuteReader();

                int quantidade = 0;

                if (reader.Read())
                {
                    quantidade = reader.GetInt32(reader.GetOrdinal("qtd"));
                }
                reader.Close();

                return quantidade;
            }
            catch (Exception ex) { throw ex; }
            finally { cmd.Connection.Close(); }
        }

        private static string GetStringNullCheck(this IDataReader reader, int ordinal) { return reader.IsDBNull(ordinal) ? null : reader.GetString(ordinal); }

    }
}
